JavaScript精要之原始类型和引用类型

概念理解:
原始值:原始类型变量中的值
引用值:就是对象,或者交做实例。

原始值被直接保存在变量的对象内,引用值则作为一个指针保存在变量对象内,该指针指向实际对象在内存中的存储位置。

创建对象:

1
var object = new Object();

注意:因为引用类型不在变量中直接保存对象,所以,这里的object变量实际上并不包含对象的实例。这里的object是一个指向内存中实际对象所在位置的指针。这里的object的正确名称,应该叫被创建对象的引用!!!!

原始类型具有的原始方法(总结):

1
2
3
4
5
6
7
8
9
10
11
var name = "Cooling";
var lowercasename = name.toLowerCase();//转化为小写
var firstLetter = name.charAt(0);//得到C
var middleOfName = name.substring(2,5);//得到2-4的字符

var count = 10;
var fixedCount = count.toFixed(2);//10.00
var hexCount = count.toString(16);//转化为16进制a

var flag = true;
var stringFlag = flag.toString;//转换为字符串"true"

字面量形式:

字面量形式允许你在不需要使用new操作符和构造函数显式创建对象的情况下,生成引用值。

①在原始类型中:
字量面就是变量的字符串表现形式。它不是一种值,而是一种记法。

1
var name = "cooling";//这里的cooling就是字面量

②在引用类型中,存在对象字面量、数组字面量、函数字面量、正则表达式字面量:

a.对象字面量(两种):

1
2
3
4
5
6
7
8
9
10
11
var person = {
name : "cooling",
age : 20,
job : "Web Engineer"
};

var person = {
"name" : "cooling",
"age" : 20,
"job" : "Web Engineer"
};//这种形式可以方便在属性名字里加空格

b.数组字面量(两种方式):

1
2
3
4
5
var colors = ['red','green','blue'];
console.log(colors[0]);//red

var colors = new Array('red','green','blue');
console.log(colors[0]);//red

c.函数字面量:

注意这里和构造函数的区别,构造函数是对新构造的函数设置属性,这里是new一个新的函数,然后往函数里面传值。

1
2
3
4
function reflect(value){
return value;
}
var reflect = new Function("value","return value;");

d.正则表达式字面量(关于正则表达式,会另外起一篇博客详细讲解)

访问属性:

存在两种方式访问属性:

1
2
3
4
5
var array = [];
array.push(12345);
//等价于
var array = [];
array["push"](12345);//注意这里需要加双引号

也可以这么写:

1
2
3
var array = [];
var method = "push";
array[method](12345);

鉴别引用类型:

①typeof:(只能鉴别是否是函数,对于非函数,返回object)

1
2
3
4
function cooling(value){
return value;
}
console.log(typeof cooling);//function

PS:(其对于原始类型,还是可以做出判断的!)

1
2
3
4
5
6
7
8
9
alert(typeof null); // "object" 
alert(typeof function () {
return 1;
}); // "function"
alert(typeof '梦龙小站'); // "string"
alert(typeof 1); // "number"
alert(typeof a); // "undefined"
alert(typeof undefined); // "undefined"
alert(typeof []); // "object"

②instanceof(可以鉴别其具体是不是某个类型):

1
2
3
4
5
6
7
8
var items = [];
var object = {};
function cooling(value){
return value;
}
console.log(items instanceof Array);//true
console.log(object instanceof Object);//true
cobsole.log(cooling instansof Function);//true

鉴别数组:

我们都已经知道,instanceof可以用来鉴别其是否是数组。但是在同一个页面中可能存在不同的框架,当你把一个数组,从一个框架传到另一个框架时,instanceof就无法识别它,因为那个数组是来自不同框架的Array实例。我们可以使用Array.isArray()方法来检测,这也是鉴别数组的最佳方法。

1
2
var items = [];
console.log(Array.isArray(items));//true

基本包装类型(或者叫原始封装类型)-属于引用类型:

String、Number、Boolean:注意这些都属于引用类型,不过是比较特殊的引用类型。它们三的存在,使得原始类型用起来跟对象一样方便。

1
2
3
var name = "cooling";
var firstChar = name.charAt(0);
console.log(firstChar);//c

这是在背后,实际发生的:

1
2
3
4
5
var name = "cooling";
var tem = new String(name);
var firstChar = tem.charAt(0);
tem = null;//注意这里的自动销毁
console.log(firstChar);

测试上面的自动销毁部分:

1
2
3
4
var name = "cooling";
name.zs = "zs";

console.log(name.zs);//undefined

这是实际发生的:

1
2
3
4
5
6
7
8
var name = "cooling";
var tem = new String(name);
tem.zs = "zs";
tem = null;

var tem = new String(name);
console.log(tem.last);
tem = null;

提醒:instanceof是用来检测引用类型的。由于这里的name对象创建后立即被销毁,因此使用instanceof来检测这里的name的时候,会显示false,而不会显示它的对象类型。代码如下:

值得注意的是,如果这里使用typeof判断的话,是可行的,因为这里会直接把name看成原始类型,然后用typeof判断。注意typeof是既可以判断原始类型,也可以检测引用类型的!

1
2
3
4
5
6
7
var name = "cooling";
var count = 10;
var found = false;

console.log(name instanceof String);//false
console.log(count instanceof Number);//false
console.log(found instanceof Boolean);//false

如果手动创建的话,那么会有些副作用(不能够鉴别出它的数据类型):

1
2
3
4
5
6
var name = new String("cooling");
var count = new Number(10);
var found = new Boolean(false);
console.log(typeof name);//object
console.log(typeof count);//object
console.log(typeof found);//object